#include "zhiyuanguanli.h"

//构造函数的实现 
WorkerGuanLi::WorkerGuanLi()
{
//1.文件不存在	
	ifstream ifs;
	ifs.open(FILENAME, ios::in); //读文件
	if(!ifs.is_open())
	{
		cout << "文件不存在" << endl;
		//初始化属性
		//初始化记录人数 
   		this->m_EmpNum = 0;
        //初始化数组指针 
   		this->m_EmpArray = NULL;
		//初始化文件是否为空
		this->FileIsEmpty = true; 
		ifs.close();
		return;
	}
	 
//2.文件存在且数据为空 
    char ch;
	ifs >> ch;
	if(ifs.eof())
	{
		//文件为空
		cout << "文件为空！" << endl;
		//初始化记录人数 
   		this->m_EmpNum = 0;
        //初始化数组指针 
   		this->m_EmpArray = NULL;
		//初始化文件是否为空
		this->FileIsEmpty = true; 
		ifs.close();
		return; 
	}
	
	//3.文件存在 且记录数据
	int num = this->get_EmpNum();
	//cout << "职工人数为：" << num << endl;
	this->m_EmpNum = num; 
	
	//开辟空间
	this->m_EmpArray = new Worker* [this->m_EmpNum]; 
	//将文件中的数据，存到数组中
	this->init_Emp(); 
	
	
}

//菜单展示 
void WorkerGuanLi::Show_Menu()
{
	cout << "**********************************************" << endl;
	cout << "**********  欢迎使用职工管理系统！  **********" << endl;
	cout << "**********      0.退出管理系统      **********" << endl;
	cout << "**********      1.增加职工信息      **********" << endl;
	cout << "**********      2.显示职工信息      **********" << endl;
	cout << "**********      3.删除职工信息      **********" << endl;
	cout << "**********      4.修改职工信息      **********" << endl;
	cout << "**********      5.查找职工信息      **********" << endl;
	cout << "**********      6.按照编号排序      **********" << endl;
	cout << "**********      7.清空所有文档      **********" << endl;
	cout << "**********************************************" << endl;
	cout << endl;
}

//退出系统 
void WorkerGuanLi::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	exit(0);
}

//添加职工
void WorkerGuanLi::Add_Emp()
{
	cout << "请输入添加职工的人数" << endl;
	
	int addNum = 0;//保存用户的输入数量 
	cin >> addNum;
	
	if(addNum > 0)
	{
		//计算添加新空间大小 
		int newSize = this->m_EmpNum + addNum;//新空间大小 = 原空间大小 + 新增人数空间大小
		
		//开辟新空间 
		Worker** newSpace = new Worker* [newSize];//开辟在堆区 
		
		//将原来空间下的数据，拷贝到新空间下
		if(this->m_EmpArray != NULL)
		{
			for(int i = 0; i < this->m_EmpNum; ++i)
			{
				newSpace[i] = this->m_EmpArray[i]; 
			}
		} 
		
		//添加新数据 
		for(int i = 0; i < addNum; ++i)
		{
			int id;
			string name;
			int gangbian;
			cout << "请输入第" << i+1 << "个职工编号：" << endl;
			cin >> id;
			cout << "请输入第" << i+1 << "个职工姓名：" << endl;
			cin >> name;
			cout << "请选择该员工的岗位：" << endl;
			cout << "1.普通员工" << endl;
			cout << "2.经理" << endl;
			cout << "3.老板" << endl;
			cin >> gangbian; 
			
			Worker* worker = NULL;
			switch(gangbian)
			{
				case 1:
					worker = new Employee(id,name,1);
					break;
				case 2:
					worker = new Manager(id,name,2);
					break;
				case 3:
					worker = new Boss(id,name,3);
					break;
				default:
					break;
			}
			
			//将创建职工职责，保存在数组中
			newSpace[this->m_EmpNum + i] = worker; 
		}
		//释放原有空间 
		delete[] this->m_EmpArray;
		
		//更改新空间的指向
		this->m_EmpArray = newSpace;
		
		//更新 新的职工人数
		this->m_EmpNum = newSize;
		
		//更新职工不为空的标志
		this->FileIsEmpty = false; 
		
		//成功添加时保存到文件中 
		this->save();
		
		//提示添加成功
		cout << "成功添加" << addNum << "名新员工！" << endl; 
	}
	else
	{
		cout << "添加错误" << endl; 
	} 
	
	//按任意键清屏
	system("pause");
	system("cls"); 
}

//保存文件
void WorkerGuanLi::save() 
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);//用输出的方式打开文件 -- 写文件 
	
	//将每个人的数据写入文件
	for(int i = 0; i < this->m_EmpNum; ++i)
	{
		ofs << this->m_EmpArray[i]->m_Id << " "
		    << this->m_EmpArray[i]->m_Name << " "
			<< this->m_EmpArray[i]->m_BuMenId << endl;    	
	} 
	
	//关闭文件 
	ofs.close();
}

//统计文件中人数
int WorkerGuanLi::get_EmpNum()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//打开文件  读文件
	
	int id;
	string name;
	int dId;
	
	int num = 0;
	while(ifs >> id && ifs >> name && ifs >> dId)
	{
		num++;	
	} 
	return num;
} 

//初始化员工
void WorkerGuanLi::init_Emp() 
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);
	
	int id;
	string name;
	int dId;
	
	int index = 0;
	while(ifs >> id && ifs >> name && ifs >> dId)
	{
		Worker* worker = NULL;
		if(dId == 1)
		{
			worker = new Employee(id,name,dId);
		}
		else if(dId == 2)
		{
			worker = new Manager(id,name,dId);
		}
		else
		{
			worker = new Boss(id,name,dId);
		}
		this->m_EmpArray[index] = worker;
		index++;
	} 
	
	ifs.close();
}

//显示职员信息 
void WorkerGuanLi::Show_Emp()
{
	//判断文件是否为空
	if(this->FileIsEmpty)
	{
		cout << "文件为空或者文件不存在" << endl;
	} 
	else
	{
		for(int i = 0; i < m_EmpNum; ++i)
		{
			//利用多态调用程序接口
			this->m_EmpArray[i]->showXinXi(); 
		}
	}
	system("pause");
	system("cls");
}

//删除职工
void WorkerGuanLi::Del_Emp()
{
	if(this->FileIsEmpty)
	{
		cout << "文件不存在或者数据为空" << endl; 
	}
	else
	{
		cout << "请输入想要删除的职工编号：" << endl;
		int id = 0;
		cin >> id;
		int index = this->IsExist(id);
		if(index != -1)
		{
			for(int i = 0; i < this->m_EmpNum-1; ++i)
			{
				//数组中删除数据本质上是数据前移 
				this->m_EmpArray[i] = this->m_EmpArray[i+1];
			}
			this->m_EmpNum--;//更新数组中记录人员个数 
			this->save();
			cout << "删除成功" << endl;
		}
		else
		{
			cout << "删除错误，该职工不存在" << endl;
		}
	}
	system("pause");
	system("cls");
}
	
//判断职工是否存在 如果存在返回职工所在数组中的位置 不存在返回-1
int WorkerGuanLi::IsExist(int id)
{
	int index = -1;
	for(int i = 0; i < this->m_EmpNum; ++i)
	{
		if(this->m_EmpArray[i]->m_Id == id)
		{
			index = id;
	        break;
		}
	}
	return index;
} 

//修改职工
void WorkerGuanLi::Mod_Emp()
{
	if(this->FileIsEmpty)
	{
		cout << "该文件不存在或者数据为空" << endl; 
	}
	else
	{
		cout << "请输入要修改的职工编号：" << endl;
	    int id = 0;
	    cin >> id;
	    int ret = this->IsExist(id);
	    if(ret != -1)
	    {
	    	delete this->m_EmpArray[ret];
	    	
	    	int newId = 0;
	    	string newName = "";
	    	int dSelect = 0;
	    	
	    	cout << "查到：" << id << "号职工，请输入该职工新编号：" << endl; 
	    	cin >> newId;
	    	
	    	cout << "请输入新的姓名：" << endl;
	    	cin >> newName;
	    	
	    	cout << "请选择新岗位：" << endl;
	    	cout << "1.普通员工" <<endl;
	    	cout << "2.经理" <<endl;
	    	cout << "3.老板" <<endl;
	    	cin >> dSelect;
	    	
	    	Worker* worker = NULL;
	    	switch(dSelect)
	    	{
	    		case 1:
	    			worker = new Employee(newId, newName, dSelect);
	    			break;
	    		case 2:
	    			worker = new Manager(newId, newName, dSelect);
	    			break;
	    		case 3:
	    			worker = new Boss(newId, newName, dSelect);
	    			break;
	    		default:
	    			break;
			}
			//更新数据到数组中
			this->m_EmpArray[ret] = worker;
			cout << "修改成功！" << endl;
			this->save();//保存到文件中 
		}
		else
		{
			cout << "修改错误，该职工不存在" << endl;
		}
	}
	system("pause");
	system("cls");
} 

//查找员工 
void WorkerGuanLi::Find_Emp()
{
	if(this->FileIsEmpty)
	{
		cout << "文件不存在或者数据为空" << endl;
	}
	else
	{
		cout << "请输入查找方式：" << endl;
		cout << "1.按照编号查" << endl;
		cout << "2.按照姓名查" << endl;
		
		int select = 0;
		cin >> select;
		
		if(select == 1)
		{
			//按照编号查
			int id;
			cout << "请输入需要查找的职工编号：" << endl;
			cin >> id;
			
			int ret = IsExist(id);
			if(ret != -1)
			{
				cout << "查找成功，显示该职工所有信息" << endl;
				this->m_EmpArray[ret]->showXinXi();
			}
			else
			{
				cout << "查无此人" << endl; 
			}
		}
		else if(select == 2)
		{
			//按照姓名查 
			string name;
			cout << "请输入查找的姓名：" << endl;
			cin >> name;
			
			//加入判断是否查到的标志
			bool flag = false;//默认未找到该职工 
			
			for(int i = 0; i < this->m_EmpNum; ++i)
			{
				if(this->m_EmpArray[i]->m_Name == name)
				{
					cout << "查找成功，职工编号为：" << this->m_EmpArray[i]->m_Id
					     << "号职工信息如下：" << endl;
					     
					flag = true;      
				    this->m_EmpArray[i]->showXinXi();
					 
				}
			} 
			if(flag == false)
			{
				cout << "查无此人。" <<endl;
			}
		} 
		else
		{
			cout << "输入错误" << endl; 
		} 
	}
	system("pause");
	system("cls");
}

//职工编号排序
void WorkerGuanLi::Sort_Emp() 
{
	if(this->FileIsEmpty)
	{
		cout << "文件不存在或数据为空" << endl;
		system("puase");
		system("cls"); 
	}
	else
	{
		cout << "请选择排序方式" << endl;
		cout << "1.按照职工编号升序排列" << endl;
		cout << "2.按照职工编号降序排列" << endl;
		int input = 0;
		cin >> input;
		if(input == 1)
		{
			for(int i = 0; i < this->m_EmpNum-1; ++i)
			{
				for(int j = 0; j < this->m_EmpNum-1-i; ++j)
				{
					if(this->m_EmpArray[j]->m_Id > this->m_EmpArray[j+1]->m_Id)
					{
						Worker* temp = this->m_EmpArray[j];
						this->m_EmpArray[j] = this->m_EmpArray[j+1];
						this->m_EmpArray[j+1] = temp;
					}
				}
			}
		}
		else
		{
			for(int i = 0; i < this->m_EmpNum-1; ++i)
			{
				for(int j = 0; j < this->m_EmpNum-1-i; ++j)
				{
					if(this->m_EmpArray[j]->m_Id > this->m_EmpArray[j+1]->m_Id)
					{
						Worker* temp = this->m_EmpArray[j];
						this->m_EmpArray[j] = this->m_EmpArray[j+1];
						this->m_EmpArray[j+1] = temp;
					}
				}
			}
		}
		cout << "排序成功！排序后的结果为：" << endl;
		this->save();
		this->Show_Emp();//展示员工信息 
	}
}

//清空数据
 void WorkerGuanLi::Clean_File()
 {
 	cout << "请选择是否清空数据" << endl;
 	cout << "1.确认" << endl;
 	cout << "2.返回" << endl;
 	
 	int input = 0;
 	cin >> input;
 	
 	if(input == 1)
 	{
 		if(this->m_EmpArray != NULL)
 		{
 			//删除堆区的每个职工对象
			for(int i = 0; i < this->m_EmpNum; ++i)
			{
				delete this->m_EmpArray[i];
				this->m_EmpArray[i] = NULL;
			} 
			//删除堆区数组指针
			delete[] this->m_EmpArray;
			this->m_EmpArray = NULL; 
			this->m_EmpNum = 0;
			this->FileIsEmpty = true;
		}
	cout << "清除成功！" << endl;
	}
	system("puase");
	system("cls");
 }

//析构函数的实现 
WorkerGuanLi::~WorkerGuanLi()
{
	if(this->m_EmpArray != NULL)
	{
		for(int i = 0; i < this->m_EmpNum; ++i)
		{
			if(this->m_EmpArray[i] != NULL)
			{
				delete this->m_EmpArray[i];
			}
		}
		delete[] this->m_EmpArray;
		this->m_EmpArray = NULL;
	}
}